Дипломный проект A/B-тестирование

В этом проекте мы будем оценивать результаты A/B-теста, посмотрим, насколько корректно он был проведён, а также проанализируем его итоги. У нас в распоряжении будут датасет с действиями пользователей, техническое задание и несколько вспомогательных датасетов. Для того, чтобы оценить корректность проведения теста, мы проверим:

Описание данных

ab_project_marketing_events.csv — календарь маркетинговых событий на 2020 год.

Структура файла:

final_ab_new_users.csv — пользователи, зарегистрировавшиеся с 7 по 21 декабря 2020 года.

Структура файла:

final_ab_events.csv — действия новых пользователей в период с 7 декабря 2020 по 4 января 2021 года.

Структура файла:

final_ab_participants.csv — таблица участников тестов.

Структура файла:

Шаг 1. Знакомство с данными

Пропусков и дубликатов в таблице marketing_events нет. Поля с датами на этапе предобработки данных мы заменим на тип даты

В таблице new_users нет дубликатов и на этапе предобработки данных следует заменить тип столбца 'first_date' на тип datetime

Грубых дубликатов в таблице events нет. Изучим пропуски в столбце details. Признак даты события следует привести к типу даты на этапе предобработки данных.

Мы заметили, что признак 'details' заполнен только для события purchase.

Столбец 'details', согласно описанию данных, содержит сведения о дополнительных данных о событии. Поэтому пропуски здесь ни на что не повлияют. Оставим строки с пропусками как есть.

В таблице participants отсутствуют грубые дубликаты, а вот в столбце 'user_id' 1602 пользователя встречаются дважды. Это может говорить о том, что одни и те же пользователи попадали в разные группы одновременно.

Шаг 2. Предобработка данных

Типы данных в полях 'start_dt' и 'finish_dt' таблицы marketing_events, а также 'first_date' таблицы new_users и 'event_dt' таблицы events приведены к корректным. Перейдём к следующему шагу.

Шаг 3. Оцениваем корректность проведения теста

3.1 Проверяем соответствие данных требованиям ТЗ

Согласно техническому заданию, нас интересует тест recommender_system_test. Таблица participants содержит не только об этом тесте. Следует начать с того, что мы выделим записи, которые соответствуют интересующему нас тесту - в отдельную переменную.

В тесте recommender_system_test существует 6701 запись о пользователях: к группе А относится 3824 пользователей и 2877 пользователей относится к группе В.

3.2 Проверяем даты проведения теста

Убедимся, что оно время проведения теста не совпадает с маркетинговыми и другими активностями.

Проверяем дату запуска теста: 2020-12-07 и дату остановки: 2021-01-04

Мы видим, что дата остановки теста более рання, чем в тех задании: 30 декабря 2020 вместо 4 января 2021. Проводить тест в праздники особого смысла не имеет, так как это время аномалий, а аномалии портят данные.

Проверим дату остановки набора новых пользователей: 2020-12-21

Дата начала набора и дата окончания набора соответствуют нашему ТЗ — это 7 и 21 декабря 2020 года, соответственно.

3.3 Проверяем даты проведения теста на несовпадение с маркетинговыми и другими активностями

Мы проводили тест в период с 7 декабря 2020 по 4 января 2021 (на самом деле по 30 декабря, в чем мы убедились на прошлом шаге). Пора проверить, совпадает ли проведение теста с меркетинговыми и другими активностями.

Когда проводили тест, в Европе и Северной Америке (регионы EU, N.America) происходила активность 'Christmas&New Year Promo'. Это усложняет нашу задачу: ведь в период проведения активности 'Christmas&New Year Promo' становится совершенно непонятно, с чем могут быть связаны улучшения — с маркетинговой акцией или с нашим тестом.

3.4 Проверяем аудиторию теста

Посмотрим, как пересекаются пользователи в параллельных тестах

Есть 1602 уникальных пользователя, участвовавших одновременно в двух параллельно проводимых тестах: в том, который мы оцениваем — recommender_system_test и в ещё одном — interface_eu_test. Этих пользователей нам придётся удалить, потому что их наличие в наборе данных затруднит (и даже сделает невозможным) понимание того, какие события в датасете events относились к нашему тесту, а какие к параллельному.

3.5 Проверим пользователей, который участвуют в двух группах теста сразу

Пользователи внутри групп теста не пересекаются

3.6 Проверяем равномерность распределения по тестовым группам и правильность их формирования

Группы распределены неравномерно: группа A содержит 57% участников, а группа B — 42,93%

Можно заметить пиковое значение количества регистраций раз в семь дней. Обратившись к календарю за 2020-й год, можно понять, что эти дни являются понедельниками. Эффект понедельников в действии :)

3.7 Проверяем аудиторию: ожидаемое количество участников и процент пользователей из Европы должны совпадать с данными из ТЗ

Согласно ТЗ, ожидаемое количество участников равно 6000, а из Европы ожидается 15% новых пользователей от общего количества зарегистрированных пользователей в этом регионе.

Состав аудитории теста не соответствует требованиям технического задания: мы ожидали 6000 участников, а получили 6940. Реальное количество участников 6701 пользователь, из которых 6351 из Европы и 350 — из других регионов. Нужное количество пользователей из Европы у нас не набрано: оно составило не 15%, а 13.73%. Нам придётся удалить пользователей из других регионов, ведь они не были предусмотрены техническим заданием.

3.8 Чистим данные теста от избыточных пользователей

Итак, мы удалили из данных пользователей, которые попали в оба теста и тех, кто не из европейского региона, остается 4749 пользователей и активных (тех, что совершали хоть одно действие после регистрации) среди них уже не 3675 пользователей, а 2594. Посмотрим на распределение регистраций пользователей между группами тестирования.

После чистки пользователей пропорции количества пользователей между группами и распределение зарегистрированных во времени почти не изменились, таким образом, удаление не повлияло на общий вид распределения. Пики приходятся на понедельники. Как и до чистки.

3.9 Продолжим готовить данные: объединим таблицы событий с профилями пользователей теста, рассчитаем лайфтаймы и удалим данные за горизонтом событий

Согласно техническому заданию, мы должны посчитать воронку на 14 день после регистрации. Посчитаем предельную дату когорты, которая успела прожить 14 дней.

В наших данных 14 дней прожили пользователи, зарегистрировавшиеся с 7 декабря по 17 декабря 2020 года. Начиная с регистрации от 18 декабря данные неполные. Более того, по ТЗ мы анализируем воронку на 14 день жизни — события старше 14 лайфтайма нам также не нужны.

Сформируем переменные по первоначальным данным теста и "чистым" с учетом выявленных нарушений при тестировании, состоящие из событий теста events_system_test, к которым добавим дату регистрации пользователя, группу теста и лайфтайм. Удалим пользователей, зарегистрированных с 18 по 30 декабря 2020 и события, начиная с 14 лайфтайма (с 15 дня «жизни» пользователя).

Для того, чтобы сравнивать результаты теста, будем вести параллельно сразу два расчета: по фактическим данным групп и по "чистым", с удаленными пользователями двух групп и пользователями из других регионов.

Посчитаем общее количество пользователей в группах теста (активных и неактивных — тех, что не совершили ни одного действия) после удаления зарегистрированных после 17 декабря.

Мы удалили события свыше 14-го лайфтайма, потому как эти события на самом деле не представляют для нас как для исследователей интереса.

В исходной группе у нас осталось 4763 пользователя (группа А 2674, группа В 1999 пользователей), в "очищенной" — 3285 (группа А - 1889, группа В - 1396)

3.10 Проверяем ожидаемый в соответствии с ТЗ эффект: за 14 дней с момента регистрации пользователи покажут улучшение каждой метрики не менее, чем на 10%

Если смотреть по воронкам, то кажется, что эффекта от изменений нет вовсе, то есть он отсутствует. Проведём подробный анализ чуть позже, когда коснёмся изменений конверсии в воронке на разных этапах.

3.11 Вывод шага №3.

В результате оценки корректности проведения теста установлено следущее:

К заданному тесту recommender_system_test относится 6701 запись о пользователях: 3824 в группе А и 2877 в группе В.

Дата начала и окончания набора пользователей 07 декабря и 21 декабря соответствует техническому заданию.

Тест проводился с 7 по 30 декабря 2020 года. Дата остановки теста меньше, чем указано в тех.задании: 30 декабря 2020 вместо 4 января 2021. Однозначно повлияли новогодние праздники.

В момент проведения теста в Европе проводилась промо-акция 'Christmas&New Year Promo'. Понять, что именно изменения вызывают улучшения, а не параллельно проводимая акция, в таком случае крайне затруднительно.

Выявлены 1602 уникальных пользователя, которые участвовали в проверяемом (recommender_system_test) и конкурирующем (interface_eu_test) тестах одновременно.

Внутри групп теста пересечений пользователей нет

Группы разбиты неравномерно: в контрольной 57% пользователей, в тестовой 43%.

Состав аудитории теста: исходное количество участников — 6701, из которых 6351 из Европы и 350 из других регионов.

Необходимо удалить пользователей из других регионов, которые не были предусмотрены техническим заданием.

Согласно ТЗ аудитория должна состоять из 15% новых пользователей из Европы, расчетное количество участников должно быть равно 6000 пользователей. Фактическое количество участников оказалось равным 6940 человек.

В рамках подготовки к оценке результата теста были удалены пользователи из когорт, не «проживших» полных 14 дней, а также события выше 14 лайфтайма.

В исходной группе у нас осталось 4763 пользователя (группа А 2674, группа В 1999 пользователей), в "очищенной" — 3285 (группа А - 1889, группа В - 1396)

Эффект от изменений, судя по воронке, не достигнут: конверсия регистрации в покупку в группе В упала в 2 раза по сравнению с группой А. К этому моменту мы ещё вернёмся.

Шаг 4. Исследовательский анализ данных

4.1 Распределение количества событий на пользователя в выборках

В наших датасетах events_and_profiles_base и events_and_profiles_active представлены данные о пользователях, которые проявили хоть какую-то активность.

Но общее количество пользователей в группах больше на число пользователей, которые зарегистрировались, но не совершили больше ни одного действия. Общее количество пользователей в разрезе групп посчитано в переменных group_for_funnel, group_for_funnel_clear.

Для того, чтобы посчитать среднее количество событий на пользователя в каждой группе, нужно учесть две категории клиентов: тех, что совершали события и те, события которых равны нулю, иначе среднее по группе исказится.

Чтобы построить распределение количества событий на пользователя, нужно сгруппировать количество событий по каждому пользователю из таблицы событий и нулей, которые мы добавим в выборку соразмерно количеству неактивных пользователей.

Рассчитаем количество неактивных пользователей.

Нами было получено количество пользователей с нулевым количеством событий в каждой группе. Пропорции активных и неактивных пользователей в группах сильно отличаются: неактивных в группе А 40%, а в группе B — 66%. Это уже сигнал в сторону неэффективности изменений, которые тестируются в группе В.

Сформируем Series для визуализации распределения из сгруппированных по количеству событий пользователей и добавим к ним пользователей с нулевым количеством событий

Посмотрим распределение количества событий на пользователя и проведем тест на равенсто событий.

Наши гипотезы:

Выборки большие, уровень критической значимости примем равным 0.01, применим тест Манна-Уитни.

Далее оценим распределение количества событий пользователей в очищенных данных.

Мы уже подчёркивали, что пропорции активных и неактивных пользователей в группах сильно отличаются: неактивных в группе А 40%, а в группе B — 66%. Кроме того, в группе А пик приходится на 7 событий, а в группе В - на 4 и 6. Соответственно, среднее значение количества событий в группе В в 2 раза меньше, чем в группе А (2 против 4)

Отличается медиана: в группе А она на уровне 2.5 событий, а выбросы начинаются с 15 событий. В группе В медиана равна 0, а выбросы начинаются уже с 7 событий.

Разница в количестве событий на человека между группами составила 53%, соответственно проведенный тест показал предсказуемый результат: гипотеза о равенстве событий между группами не подтвердилась, выборки не равны.

Далее для понимания поведения только активных пользователей посчитаем среднее значение количества событий только между ними.

Если события распределить между активными пользователями, среднее в группе А составляет 7, а в группе В 6 событий, а медианные значения соответственно 6 и 5 событий. Группа А в целом активнее группы В.

4.2 Распределение числа событий в группах по дням

На графиках распределения событий по дням у группы А можно увидеть резкий пик количества событий с 13 по 16 декабря. У группы В он тоже есть, но не такой значительный и резкий: мы помним, что в группе В неактивных пользователей больше половины.

Скорее всего причина всплеска заключается в предстоящих новогодних праздниках, поскольку это пора массовых покупок для подарков. В дальнейшем можно наблюдать постепенное снижение активности пользователей, которая замедляется с началом промоакции Christmas&New Year Promo с 25 декабря, но вскоре она всё равно падает.

4.3 Изменения конверсии на разных этапах

Согласно ТЗ ожидаемым эффектом от тестируемых изменений является улучшение каждой метрики как минимум на 10% за 14 дней с момента регистрации. Имеем по факту:

Если смотреть конверсию регистрации в корзину, то в целом она уменьшилась на почти 9% в исходных данных (с 18% до 9%) и на 8% (с 17% до 9%) в очищенных.

Больше всего пользователей теряется на этапе перехода к странице товара: до нее доходит только 38% пользователей группы А и 19% пользователей группы В. Но те, кто доходит до корзины, в подавляющем большинстве платит за покупку. Можно заметить, что в группе В есть 3% увеличение пользователей, дошедших до корзины, но в тоже время высок процент тех, кто покупку не оплатил.

Вывод: результатом тестирования не подтвердилось увеличение конверсии на каждом этапе: конверсия увеличилась только на этапе перехода с регистрации на страницу товара.

4.4 Какие особенности данных нужно учесть, прежде чем приступать к A/B-тестированию

Проверим наши данные.

Разница в размерах групп:

В исходном датасете присутствуют 1602 пользователя, учавствовавшие в двух тестах. Пользователи, принимавшие участие одновременно в группах А и В, отсутствуют.

В очищенном датасете участники двух тестов. Тем не менее пропорции групп в обоих случаях сильно отличаются: в первом случае группа А больше группы В на 33%, во втором на 35%

Ранее, при анализе воронки, мы видели, что наши ключевые метрики (конверсии в события) по группам различаются более чем на 1%. Это может говорить о том, что результаты уже заметны и без А/В теста.

В данных теста присутствуют факторы, которые могут исказить результат тестирования:

В группах теста видна значительная разница в пропорциях: группа А больше группы В почти на 34% в исходных данных и на 35% в очищеных.

В исходном датасете присутствуют 1602 пользователя, учавствовавшие в двух тестах. Поскольку мы не можем однозначно идентифицировать к какому тесту относятся их события, данные пользователи могут исказить результат.

В исходном датасете присутствуют пользователи, которые не относятся к целевой аудитории (региону EU), что также может вести к искажению результата теста

Наши ключевые метрики (конверсии в события) по группам различаются более чем на 1%. Это может говорить о том, что результаты уже заметны и без А/В теста.

Шаг 5. Оценка результатов A/B-тестирования

Исходя из анализа результатов тестирования можно сказать, что внесенные в группу В изменения не повлияли на воронку положительно: речь не идет о 10% увеличении конверсии на каждом этапе воронки: мы говорим о глобальном снижении конверсии практически на всех этапах кроме конверсии страницы товара в корзину, где есть 3% увеличения, но и оно также нивелируется последующим падением конверсии корзины в покупку.

Теоретически уже понятнен результат, но все же проверим статистическую разницу долей z-критерием.

Для проведения теста сформулируем гипотезы:

Применим для групп Z-тест на равенство долей. Размеры наших групп превышает 2 тыс. пользователей на первом этапе, но затем уменьшаются до размера не менее 100. Коэффициент статистической значимости примем равным 0.01.

Применим z-test для исходных и очищенных групп тестирования.

На всех уровнях воронки событий при проведении z-теста гипотезу о равенстве групп не удалось подтвердить. Конверсии с большой степенью вероятности отличаются: и в исходном, и в очищенном датасетах.

Гипотезы о равенстве конверсий в группах А и В не удалось подтвердить. Это означает, что они различаются. Мы подтвердили выводы, сделанные в результате исследовательского анализа.

Шаг 6. Выводы

Для анализа результатов А/В теста был представлен датасет с действиями пользователей, техническое задание и несколько вспомогательных датасетов c результатами тестирования. В процессе предобработки была произведена замена формата данных, содержащих дату.

Результаты исследования:

К заданному тесту recommender_system_test относится 6701 запись о пользователях: 3824 в группе А и 2877 в группе В.

Оценка корректности проведения теста:

Дата начала и окончания набора пользователей 7 декабря и 21 декабря 2020 года соответствует техническому заданию.

Тест проводился с 7 декабря по 30 декабря. Дата остановки теста меньше, чем указано в тех.задании: 30 декабря вместо 4 января. Здесь повлияли новогодние праздники.

В момент проведения теста в Европе проводилась промо-акция 'Christmas&New Year Promo'. Понять, что именно изменения вызывают улучшения, а не параллельно проводимая акция, в таком случае крайне затруднительно.

Выявлены 1602 уникальных пользователя, которые участвовали в проверяемом (recommender_system_test) и конкурирующем (interface_eu_test) тестах одновременно. Поскольку события в датасете events не позволяют отнести событие к одному из тестов, оставляя этих пользователей в тесте мы можем существенно исказить результаты.

Внутри групп теста пересечений пользователей нет

Группы разбиты неравномерно: в контрольной 57% пользователей, в тестовой 43%.

Состав аудитории теста: исходное количество участников - 6701, из которых 6351 из Европы и 350 из других регионов.

Согласно техническому заданию аудитория должна состоять из 15% новых зарегистрированных пользователей из Европы, расчетное количество участников - 6000 пользователей. Фактическое количество участников составило 6940 человек, а фактически набрано только 13.73% аудитории из Европы.

Мы удалили пользователей из других регионов, которые не были предусмотрены техническим заданием.

Таким образом, в исходной группе нашего теста осталось 4763 пользователя (активных и неактивных) (группа А 2674, группа В 1999 пользователей), в "очищенной"(контрольной группе, где мы производим корректировки на выявленные несоответствия тех.заданию, а именно удалили 1602 пользователя-участника двух тестов и 350 пользователей, не относящихся к региону EU)-3285 (А- 1889, В- 1396) )

Эффект от изменений, судя по воронке, не достигнут: конверсия регистрации в покупку в группе В упала в 2 раза по сравнению с группой А.

Исследовательский анализ

Соотношение активных и неактивных пользователей в группах сильно отличаются: неактивных в группе А 40%, а в группе B 66%. Если смотреть на распределение количества событий в целом по группам (активных и неактивных пользователей в совокупности), то в группе А пик приходится на 7 событий, а в группе В - на 4 и 6. Среднее значение количества событий в группе В в 2 раза меньше, чем в группе А (2 против 4).

Отличается и медиана: в группе А она на уровне 2.5 событий, а выбросы начинаются с 15 событий. В группе В медиана равна 0, а выбросы начинаются уже с 7 событий.

Если события распределить только между активными пользователями, среднее в группе А составляет 7, а в группе В 6 событий, а медианные значения соответственно 6 и 5 событий.

То есть группа А в целом активнее группы В, а разница событий на пользователя в группе В меньше, чем в группе А на 53%.

Согласно тех.заданию ожидаемым эффектом от тестируемых изменений является улучшение каждой метрики не менее, чем на 10%, за 14 дней с момента регистрации. Фактически:

конверсия событий регистрации в страницу товара уменьшилось на 18% на исходных данных и на 19% на очищенных конверсия страницы товара в корзину увеличилась на 3% в исходных данных и на 4% в очищенных конверсия корзины в покупку уменьшилась почти на 5% в исходных данных и осталась на старом уровне в очищенных. Если смотреть конверсию регистрации в корзину, то в целом она уменьшилась на почти 9% в исходных данных (с 18% до 9%) и на 8% (с 17% до 9%) в очищенных.

Больше всего пользователей теряется на этапе перехода к странице товара: до нее доходит только 38% пользователей группы А и 19% пользователей группы В. Но те, кто доходит до корзины, в подавляющем большинстве платит за покупку. Можно заметить, что в группе В есть 3% увеличение пользователей, дошедших до корзины, но он нивелируется процентом так и не оплативших покупку.

Таким образом, результатом тестирования не подтвердилось увеличение конверсии на каждом этапе: конверсия увеличилась только на этапе перехода с регистрации на страницу товара.

Факторы, которые могут исказить результат тестирования:

В группах теста видна значительная разница в пропорциях: группа А больше группы В почти на 34% в исходных данных и на 35% в очищеных.

В исходном датасете присутствуют 1602 пользователя, учавствовавшие в двух тестах. Поскольку мы не можем однозначно идентифицировать к какому тесту относятся их события, данные пользователи могут исказить результат.

В исходном датасете присутствуют пользователи, которые не относятся к целевой аудитории (региону Европы), что также может вести к искажению результата теста

Кроме того, наши ключевые метрики (конверсии в события на разных уровнях воронки) по группам различаются более чем на 1%. Это может говорить о том, что результаты уже заметны и без А/В теста.

Общий результат

При проведении А/В тестирования z-критерием гипотезы о равенстве конверсий в группах А и В не удалось подтвердить. Это означает, что они различаются. Мы подтвердили выводы, сделанные в результате исследовательского анализа: конверсии различаются, и не в лучшую сторону, следовательно предлагаемые к внесению изменения, которые были целью тестирования, не будут эффективными.

Мы провели анализ на исходных данных и данных, которые были скорректированы на выявленные факторы, способные привести к искажению результатов (удалили пользователей-участников двух тестов, а также пользователей из других регионов). Очистка прошла равномерно по всему датасету и поэтому почти не изменила характер поведения пользователей. Поэтому с определенной долей вероятности можно утверждать, что результаты теста соответствуют действительности. Тем не менее ошибок при проведении эксперимента допущено много, а время его проведения выбрано крайне неудачное (захвачен период промоакции), поэтому доверять его результатам рискованно.